// Package tencent
/**
* @Project : geektime-basic-go-study
* @File    : service.go
* @IDE     : GoLand
* @Author  : Tvux
* @Date    : 2024/10/4 17:56
**/

package tencent

import (
	"context"
	"fmt"
	"geektime-basic-go-study/webook/backend/internal/service/sms"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	tencentSMS "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms/v20210111"
)

var (
	_ sms.Service = (*Service)(nil)
)

type Service struct {
	client *tencentSMS.Client
	// 短信 SdkAppId，在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage)  添加应用后生成的实际 SdkAppId，示例如1400006666。
	smsSdkAppId *string
	// 短信签名内容，使用 UTF-8 编码，必须填写已审核通过的签名，例如：腾讯云，签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看。
	// <dx-alert infotype="notice" title="注意"><ul><li>发送国内短信该参数必填，且需填写签名内容而非签名ID。
	// </li><li>发送国际/港澳台短信该参数非必填。</li></ul></dx-alert>
	signName *string

	provider sms.ProviderName
}

func (Self *Service) Send(ctx context.Context, tplId string, args []string, phones ...string) error {
	req := tencentSMS.NewSendSmsRequest()

	req.SmsSdkAppId = Self.smsSdkAppId
	req.SignName = Self.signName
	req.TemplateId = common.StringPtr(tplId)
	req.PhoneNumberSet = common.StringPtrs(phones)
	req.TemplateParamSet = common.StringPtrs(args)

	resp, err := Self.client.SendSms(req)
	if err != nil {
		return err
	}
	for _, status := range resp.Response.SendStatusSet {
		// 因为可能会发送很多个手机号，这里遇到报错就直接返回，可以选择返回一个错误切片，可能不止发送某个手机号出错
		if status.Code == nil {
			// 先判断一下是否为空，避免导致下面解引用失败导致panic
			return fmt.Errorf("发送失败，原因：status.Code == nil")
		}
		if *(status.Code) != "Ok" {
			return fmt.Errorf("发送失败，code: %s，原因：%s", *status.Code, *status.Message)
		}
	}
	return nil
}

func (Self *Service) GetProvider() sms.ProviderName {
	return Self.provider
}

func NewService(client *tencentSMS.Client, smsSdkAppId string, signName string) sms.Service {
	return &Service{
		client:      client,
		smsSdkAppId: &smsSdkAppId,
		signName:    &signName,
		provider:    sms.TencentProvider,
	}
}
